/*!
 * # 模块 Api 类:
 *  Inbox - 已接收的通知
 * 
 * # 描述:
 *  提供对所有已经接收通知的访问和操作，包括未读通知（新通知）和已读通知。
 *  
 *  Copyright (c), 上海沃恩信息科技有限公司.
 *  All rights reserved.
 *  Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Pittypat;

namespace Waln.Notifying.Inbox
{
	/// <summary>
	/// 提供对模块 已接收的通知 中功能的封装和调用。
	/// </summary>
	[global::Pittypat.Module(global::Pittypat.ModulePresentation.UI, AllowAnonymous = false)]
	public sealed class Api : global::Pittypat.Module
	{
		#region ListAsync

		/// <summary>
		/// 查询当前用户接收到的通知列表。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回所有输出参数的字典，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> ListAsync(
			global::Pittypat.FunctionModel<Args.List> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回所有输出参数的字典
			return model.Success ? model.OutArgs : null;
		}

		#endregion

		#region DetailsAsync

		/// <summary>
		/// 查询和显示通知的详细信息。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回所有输出参数的字典，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> DetailsAsync(
			global::Pittypat.FunctionModel<Args.Details> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回所有输出参数的字典
			return model.Success ? model.OutArgs : null;
		}

		#endregion

		#region ReadAsync

		/// <summary>
		/// 将指定的通知标记为已经阅读。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 阅读时间，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> ReadAsync(
			global::Pittypat.FunctionModel<Args.Read> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回阅读时间
			return model.Success ? model.Args.ReadTime : null;
		}

		#endregion

		#region TopAsync

		/// <summary>
		/// 将指定的通知置顶。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 置顶时间，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> TopAsync(
			global::Pittypat.FunctionModel<Args.Top> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

			// 如果操作成功，返回置顶时间
			return model.Success ? model.Args.TopTime : null;
		}

		#endregion

		#region DeleteAsync

		/// <summary>
		/// 删除一条或者多条通知消息。
		/// </summary>
		/// <param name="model">功能模型对象，其中包含了功能的参数列表、执行状态以及相关消息。</param>
		/// <param name="progress">跟踪和汇报异步操作的进度。</param>
		/// <returns>操作成功返回 附件文件路径列表，否则返回 null。</returns>
		public async global::System.Threading.Tasks.Task<global::Pittypat.IJson> DeleteAsync(
			global::Pittypat.FunctionModel<Args.Delete> model, 
			global::Pittypat.IAsyncProgress progress)
		{
			// 执行数据操作
			await this.DataService.Exec(model, progress);

            if (model.Success)
            {
                // 删除虚拟路径对应的物理文件
                global::Pittypat.Web.VirtualFile.Delete(model.Args.AttachmentUrls);
            }

            // model 没有定义输出参数，返回操作的结果消息
            return null;
        }

		#endregion
	}
}
